#ifndef __MYRPCPROVIDER_H__
#define __MYRPCPROVIDER_H__

#include <google/protobuf/service.h>
#include <google/protobuf/descriptor.h>
#include "zookeeperutil.h"
#include <muduo/net/TcpConnection.h>
#include <muduo/net/TcpServer.h>
#include <muduo/net/InetAddress.h>
#include <muduo/net/EventLoop.h>
#include <functional>
#include <string>
#include <unordered_map>

class MyRPCProvider
{
public:
    void NotifyService(google::protobuf::Service* service);
    ~MyRPCProvider();
    void Run();

private:
    muduo::net::EventLoop eventLoop;
    struct ServiceInfo 
    {
        // 指向服务对象的指针
        google::protobuf::Service* service;
        // 方法名以及对应的方法描述器指针
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor*> method_map;
    };

    // 服务端所有的服务信息，每个服务信息包含了服务对象名以及该服务的具体信息
    // 具体信息包含了指向服务对象的指针以及该服务对象所属的所有方法信息
    std::unordered_map<std::string, ServiceInfo> service_map;

    // 新的连接进来的处理函数
    void OnConnection(const muduo::net::TcpConnectionPtr& conn);
    // 连接上有数据到达
    void OnMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buffer, muduo::Timestamp receive_time);
    // 发送数据
    void SendRpcMessage(const muduo::net::TcpConnectionPtr& conn, google::protobuf::Message* response);
};

#endif